home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 101-125 / scopedisk102 / hamsharp / hamsharp4.c < prev   
C/C++ Source or Header  |  1995-03-19  |  1KB  |  58 lines

  1. /*
  2. ** Part 4
  3. */
  4.  
  5. #include <stdio.h>
  6.  
  7. int **diff = NULL;
  8. int intensity [16][16][16];
  9.  
  10. /* Prepare to call rgberr */
  11. initrgberr ()
  12. {
  13.    char *calloc ();
  14.    int i, j;
  15.    int r, g, b;
  16.  
  17.    /* Setup squares of differences lookup table */
  18.    diff = (int **) calloc (16, sizeof (int *));
  19.    if (diff == NULL)
  20.       fatalerr ("Out of memory");
  21.    for (i = 0; i < 16; i++) {
  22.       diff [i] = (int *) calloc (16, sizeof (int));
  23.       if (diff [i] == NULL)
  24.          fatalerr ("Out of memory");
  25.       for (j = 0; j < 16; j++)
  26.          diff [i][j] = (i - j) * (i - j);
  27.    }
  28.  
  29.    /* Setup intensity table */
  30.    for (r = 0; r < 16; r++)
  31.       for (g = 0; g < 16; g++)
  32.          for (b = 0; b < 16; b++)
  33.             intensity [r][g][b] = (3 * r + 6 * g + b) * 15 / 150;
  34. }
  35.  
  36. /* Finish calling rgberr */
  37. freergberr ()
  38. {
  39.    int i;
  40.  
  41.    if (diff != NULL) {
  42.       for (i = 0; i < 16; i++)
  43.          free (diff [i]);
  44.       free (diff);
  45.       diff = NULL;
  46.    }
  47. }
  48.  
  49. /* Evaluates 'distance' between 2 colours */
  50. rgberr (r1, g1, b1, r2, g2, b2)
  51. {
  52.    return (diff [intensity [r1][g1][b1]][intensity [r2][g2][b2]] +
  53.            diff [r1][r2] +
  54.            diff [g1][g2] +
  55.            diff [b1][b2]);
  56. }
  57.  
  58.